package com.h3c.ptability.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.h3c.ptability.dto.OptionsDTO;
import com.h3c.ptability.dto.PtDeptDTO;
import com.h3c.ptability.dto.PtUserDeptMonthDTO;
import com.h3c.ptability.entity.PtDept;
import com.h3c.ptability.entity.PtUserDeptMonth;
import com.h3c.ptability.support.PageQuery;
import com.h3c.ptability.vo.PtUserDeptMonthVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * IPtUserDeptMonthService接口
 *
 * @author h24002
 * @date 2022-10-27
 */
public interface IPtUserDeptMonthService {
    /**
     * 获取有效部门架构，排除研究开发部外协
     * @return 有效部门架构
     */
    List<PtDept> getPtDeptList();

    /**
     * 查询应用下当前部门下的部门集合
     * @param dto 应用+日期+部门
     * @return 部门列表信息，含授权主管信息
     */
    List<PtDeptDTO> queryChildrenDeptList(PtUserDeptMonthDTO dto);

    /**
     * 导入用户授权部门信息
     *
     * @param appId 应用id
     * @param file  用户授权部门信息文件
     */
    void importDeptUserData(String appId, MultipartFile file);

    /**
     * 补充或修复员工的授权部门信息
     *
     * @param dateMonth   日期
     * @param appId       应用编码
     * @param ptDeptList  部门列表
     * @param eosUserList 需要修改的已授权部门 的用户列表信息
     */
    void modifyUserDeptMonth(int dateMonth, String appId, List<PtDept> ptDeptList, List<String> eosUserList);

    /**
     * 拓展部门集合，加载下级部门列表
     * @param ptDeptList 部门集合
     * @param deptList 当前部门列表
     * @param addDeptList 待补充的部门列表
     */
    void expandDept(List<PtDept> ptDeptList, List<Integer> deptList, List<Integer> addDeptList);

    /**
     * 查询用户授权的部门树(一二三级部门)
     *
     * @param dto 查询条件
     * @return 部门树结构
     */
    List<OptionsDTO> queryUserDeptMonthTree(PtUserDeptMonthDTO dto);

    /**
     * 查询部门树(一二三级部门)
     *
     * @param dto 查询条件
     * @return 部门树结构
     */
    List<OptionsDTO> queryDeptTreeSelection(PtUserDeptMonthDTO dto);

    /**
     * 检查操作权限
     * @param appId 应用编码
     */
    void checkOperationValid(String appId);

    /**
     * 分页查询
     *
     * @param pageQuery 查询条件
     * @return IPage<com.h3c.board.vo.PtUserDeptMonthVO>
     * @author h24002
     * @date 2022-10-27
     */
    IPage<PtUserDeptMonthVO> selectPage(PageQuery<PtUserDeptMonthDTO> pageQuery);

    /**
     * 重置用户授权的部门数据
     *
     * @param dto 实体
     */
    void update(PtUserDeptMonthDTO dto);

    /**
     * 添加数据
     *
     * @param dto 实体
     * @author h24002
     * @date 2022-10-27
     */
    void insertDto(PtUserDeptMonthDTO dto);

    /**
     * 插入授权的部门数据
     * @param info 实体
     */
    void insert(PtUserDeptMonth info);


    /**
     * 批量插入授权的部门数据
     * @param dtoList 授权的部门数据
     */
    void insertDtoList(List<PtUserDeptMonthDTO> dtoList);

    /**
     * 批量插入授权的部门数据
     * @param list 授权的部门数据
     */
    void insertList(List<PtUserDeptMonth> list);

    /**
     * 根据条件删除授权的部门数据
     *
     * @param condition 条件
     * @author h24002
     * @date 2022-10-27
     */
    void delete(PtUserDeptMonthDTO condition);

    /**
     * 根据条件查询授权的部门数据
     *
     * @param condition 条件
     * @return com.h3c.board.domain.PtUserDeptMonth
     * @author h24002
     * @date 2022-10-27
     */
    List<PtUserDeptMonthVO> select(PtUserDeptMonthDTO condition);

    List<String> userIdOfDeptRole(PtUserDeptMonthDTO condition);

    /**
     * 月度授权部门数据初始化
     *
     * @param dateMonth 可查询年月
     * @param appId 授权应用
     * @return 初始化结果信息
     */
    String initPtUserDeptMonth(int dateMonth, String appId);


    /**
     * 重置人力看板 部门主管角色 用户列表
     *
     * @param deptManageRole 部门主管角色
     * @param appId 人力看板
     * @param deptManagerIds 部门主管信息
     * @return  重置人力看板 部门主管角色用户结果
     */
    String resetDeptManage(String deptManageRole, String appId, List<String> deptManagerIds);


    /**
     * 补充一级授权部门信息
     *
     * @param dateMonth 日期
     * @param appId 人力看板
     * @param deptList 部门列表
     * @param userList 需要修改的已授权部门 的用户列表信息
     * @return  补充一级授权部门信息结果
     */
    String replenishTopUserDeptMonth(int dateMonth, String appId, List<PtDept> deptList, List<String> userList);


    /**
     * 补充 自动主管角色 的授权部门数据
     *
     * @param dateMonth       日期
     * @param appId           人力看板
     * @param eosUserList     手工授权部门的角色人员列表
     * @param deptManagerList 一二级部门主管信息
     * @return 补充自动主管角色的授权部门数据结果
     */
    String replenishManageDeptManageMonth(int dateMonth, String appId, List<String> eosUserList, List<PtDept> deptManagerList);
}
